他アカウントのEventBridgeのイベントバスに対してイベントを発行する
どうも!オペレーション部の西村祐二です。
最近、EventBridgeを触っています。
今回は他AWSアカウントにあるEventBridgeのイベントバスに対してeventを発行してみます。
想定する場面はマイクロサービス化したサービスなどに対してイベント発行したい時や、別アカウント上にあるサービスを利用したい時にEventBridgeを使うことを想定しています。
EventBridgeを使うことで疎結合なアーキテクチャを構築することができます。
今回は動作確認しやすいようにEventBridgeのターゲットにログ出力するだけのlambdaを設定して作業進めていきます。
やってみる
受信側アカウントBの作業
EventBrigeのイベントバスのアクセス制御設定
他アカウントからアクセスできるように設定していきます。
リソースベースのポリシーを記載することでアクセス制御することができます。
「テンプレートをロード」をクリックすると下記のようなテンプレートが入力されます。
### ユースケースに合わせて、ポリシーに含めるセクションを選択します。### で始まるすべての行を (行末の ### まで) 削除してください。### ### ポリシーには以下を含める必要があります。### { "Version": "2012-10-17", "Statement": [ ### PutEvents アクションを使用する権限をアカウントに付与するには、以下を含めます。そうでない場合はこのセクションを削除します。### { "Sid": "allow_account_to_put_events", "Effect": "Allow", "Principal": { "AWS": "<ACCOUNT_ID>" }, "Action": "events:PutEvents", "Resource": "arn:aws:events:ap-northeast-1:00000000000:event-bus/default" }, ### 次のセクションを含めると、PutEvents アクションを使用する権限が AWS 組織のメンバー全員に付与されます ### { "Sid": "allow_all_accounts_from_organization_to_put_events", "Effect": "Allow", "Principal": "*", "Action": "events:PutEvents", "Resource": "arn:aws:events:ap-northeast-1:00000000000:event-bus/default", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-teouhctvah" } } }, ### 次のセクションを含めると、アカウントに作成したルールを管理する権限がアカウントに付与されます ### { "Sid": "allow_account_to_manage_rules_they_created", "Effect": "Allow", "Principal": { "AWS": "<ACCOUNT_ID>" }, "Action": [ "events:PutRule", "events:PutTargets", "events:DeleteRule", "events:RemoveTargets", "events:DisableRule", "events:EnableRule", "events:TagResource", "events:UntagResource", "events:DescribeRule", "events:ListTargetsByRule", "events:ListTagsForResource"], "Resource": "arn:aws:events:ap-northeast-1:00000000000:rule/default", "Condition": { "StringEqualsIfExists": { "events:creatorAccount": "<ACCOUNT_ID>" } } }] }
今回、putEventsだけ許可したいので下記のように設定しました。xxxxxxxxxの部分には送信側のアカウントAのアカウントIDが入ります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow_account_to_put_events", "Effect": "Allow", "Principal": { "AWS": "xxxxxxxxxx" }, "Action": "events:PutEvents", "Resource": "arn:aws:events:ap-northeast-1:yyyyyyyyyyy:event-bus/default" } ] }
ログ出力するLambda
動作確認が目的のため下記のようなログを出力するだけのLambdaを作成しておきます。
下記はランタイムがPythonですが何でも良いです。
import json def lambda_handler(event, context): print(json.dumps(event))
ルールを作成
今回、ルール名は「test」として、イベントパターンは送信側のアカウントAから送られてきたすべてのイベントを受信するように設定しています。
{ "account": ["<送信側アカウントAのAWSアカウントID>"] }
先程作成したLambdaを指定します。
設定が完了したら下部にある作成ボタンを押して完了です。
送信側アカウントAの作業
ルールを作成
今回、ルール名は「test」として、発行するイベントをわかりやすいように5分に一回イベント発火するようにポーリングの設定を行います。
ターゲットは「別のアカウントまたはリージョンのイベントバス」を選択し、イベントバスには受信側のアカウントBのバスを指定します。
設定ができたら下部の作成ボタンを押して作業完了です。
動作確認
5分待つとアカウントAからイベントが発行されて、受信側アカウントBでターゲットに設定したLambdaのCloudWatch Logsに下記のように出力されていたら成功です。
{ "version": "0", "id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx", "detail-type": "Scheduled Event", "source": "aws.events", "account": "<送信側AWSアカウントID>", "time": "20xx-xx-xxTxx:xx:xxZ", "region": "ap-northeast-1", "resources": [ "arn:aws:events:ap-northeast-1:<受信側AWSアカウントID>:rule/test" ], "detail": {} }
さいごに
今回は他AWSアカウントにあるEventBridgeのイベントバスに対してeventを発行して動作確認するところを紹介しました。
EventBridgeを使うとマイクロサービスを構築する時や、別アカウント上にあるサービスを利用したい時に疎結合なアーキテクチャにすることができるので、その機会があれば試してみてください。
実際に試してみての所感は、デバッグ方法に課題を感じました。発行したイベントがきちんと送信されたか、きちん受信できたか、エラーが発生したとき原因は何かを確認する手段があまりなくハマるときはとことんハマりそうな予感がしました。
本ブログが誰かの参考になれば幸いです。